package com.springboot.jdk.socket;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

/**
 * Socket 客户端程序
 *
 * @author: zr
 * @date: 2021-10-21
 */
public class SocketClient {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 9000);

        // 此处应该会找DNS服务器查找域名对应的ip地址
        // 接下来需要跟那个ip地址上的9000端口的服务器程序进行TCP三次握手，建立连接
        // 这个时候他就会构造一个三次握手中的第一个握手的TCP包
        // 把这个TCP包里放入三次握手需要的数据
        //  把这个TPC包封装在PI包里，是有对应的目标的ip地址，在分布在在以太网包里
        // 通过底层的硬件设备，走以太网协议发送出去，路由器，人家通过iP地址查找路由表，确定下一个路由器的位置
        // 查找下一个路由器的mac地址写入到以太网的包头，走下一个子网广播出去
        // 通过层层的转发，一致到目标的服务器上去

        // 服务器接收到三次握手的第一次握手的TCP包
        // 就会回传第二次握手的TCP包给这个客户端程序，客户端再次发送第三次握手的TCP包过去
        // 三次握手成功，TCP连接就建立起来了
        OutputStream os = socket.getOutputStream();
        InputStreamReader isr = new InputStreamReader(socket.getInputStream());

        // 先发送一条数据过去，服务端就会回传一条数据过来，然后就可以通过InputStream读取到数据
        os.write("你好".getBytes());

        // 发送数据流，底层拆分为一个一个的TCP包发送过去

        char[] chars = new char[1024 * 1024];
        // 客户端通过socket拿到输入流
        // 通过输入流拿到服务端回传过来的数据
        // 服务端收到数据之后，是会回传数据过来的
        // 回传过来之后，客户端就可以读取到响应数据
        int len = isr.read(chars);

        if (len != -1) {
            String s = new String(chars, 0, len);
            System.out.println("客户单接收到数据：" + s);
            // len = isr.read(chars);
        }

        os.close();
        isr.close();
        socket.close();
    }

}
